package com.ymx.darling.mapper;

import com.ymx.darling.cursor.Cursor;
import com.ymx.darling.dialect.page.Page;

import java.util.List;
import java.util.Map;

/**
 * sql操作接口
 * @author 爱Java的小于
 */
public interface SqlMapper {
    /**
     * 查询一条记录 并封装为一个javabean
     *
     * @param sql sql
     * @param param sql参数
     * @return T
     */
    <T> T selectOne(Class<?> module, String sql, Object... param);


    /**
     * 查询多条记录
     *
     * @param sql sql
     * @param param sql参数
     * @return List
     */
    <T> List<T> selectList(Class<?> module, String sql, Object... param);


    /**
     * 将结果集中的每条记录映射为 K 类型
     * 将多个K放入Map中
     *
     * @param sql sql字符串
     * @param propertyKey 指定K的key的字段名称
     * @param param sql占位符参数
     * @param <K> K
     * @return Map
     */
    <K,T> Map<K,T> selectMap(Class<?> module, String sql, String propertyKey, Object... param);


    /**
     * 从数据库返回一个游标接口
     * 所有Setting接口的设置无效(分页配置除外)
     * @param type 映射类型
     * @param faceSize 一次性从数据库读取多少条数据
     * @param sql sql
     * @param param 占位符参数
     * @param <T> T
     * @return cursor
     */
    <T> Cursor<T> selectCursor(Class<?> type, int faceSize, String sql, Object... param);


    /**
     * 查询分页数据
     * @param type 结果集映射类型
     * @param sql sql
     * @param param sql参数
     * @param <T> T
     * @return Page
     */
    <T> Page<T> selectPage(Class<?> type, String sql, Object... param);


    /**
     * 执行增 删 该操作的sql
     * @param sql sql字符串
     * @param param sql占位符参数
     * @return int 返回影响的行数
     */
    int update(String sql, Object... param);
}
